# http://www.cis.upenn.edu/~xtag/
# 处理动词的各种变形信息

import os
import re
import csv

def noun_plural(row):
    word = row[0]
    wf   = row[3]
    # 多数情况下，复数要加's'.
    if (word+"s") == wf:
        return  wf #print(word+":"+wf)

    # sh, ss, x, s等字母后，复数要加'e
    if re.search("sh$|ss$|x$|s$", word):
        if (word + "es") == wf:
            return wf #print(word+":"+wf)
        else:
            return None#
    # 以辅音字母加'y '结尾的动词, 用'ies '代替'y '构成's '形式,
    if re.search("[^aeiou]y$", word):
        if re.sub("y$", "ies", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)

    # f或fe，结尾的名词，数量不多，构成复数时，用ves
    if re.search("fe$|f$", word):
        if re.sub("fe$|f$", "ves", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)

    # 某些以us结尾的名词，复数词尾是'i'.
    if re.search("us$", word):
        if re.sub("us$", "i", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)

    # 某些以'um，结尾的名词，复数词尾是a.
    if re.search("um$", word):
        if re.sub("um$", "a", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)

    # 大多数以，is，结尾的名词，构成复数用'es，代替'is'.
    if re.search("is$", word):
        if re.sub("is$", "es", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)

    # 些以'a'结尾的名词，构成复数时词尾加e
    if re.search("a$", word):
        if re.sub("a$", "ae", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)


def verb_Singular_From_in_Third_Personal(row):
    word = row[0]
    wf   = row[3]

    if word == wf:
        return wf  #print(word+":"+row[3])

    # 多数动词的, s形式由原形加词尾, s构成
    if (word+"s") == wf:
        return  wf #print(word+":"+wf)

    # 形以辅音字母加'y '结尾的动词, 用'ies '代替'y '构成's '形式,
    if re.search("[^aeiou]y$", word):
        if re.sub("y$", "ies", word) == wf:
            return wf #print(word+":"+wf)
        else:
            return None##print(word+":"+wf)

    # sh, ch, ss, x , zz, o 结尾的动词, 原形后加es
    if re.search("sh$|ch$|ss$|x$|zz$|o$", word):
        if (word + "es") == wf:
            return wf #print(word+":"+wf)
        else:
            return None#

    # s结尾的单音节词, 原形后加es
    if re.search("s$", word):
        if (word + "es") == wf:
            return wf #print(word+":"+wf)
        else:
            return None#print(word+":"+wf)

    return None

def verb_present_participle(row):
    if len(row) < 7: return

    word = row[0]
    pp   = row[5]

    # 一般情况下在动词后加ing
    if (word+"ing") == pp:
        return pp #print(word+":"+pp)

    # 以ie结尾的名词, 一般将ie改为y, 再加ing
    if re.search("ie$", word):
        if re.sub("ie$", "ying", word) == pp:
            return pp #print(word+":"+pp)
        else:
            return None#print(word+":"+pp)

    # 以不发音的字母e结尾的动词, 先去掉e再加ing
    if re.search("e$", word):
        if re.sub("e$", "ing", word) == pp:
            return pp #print(word+":"+pp)
        else:
            return None#print(word+":"+pp)

    # 以一个元音字母和一个辅音结尾的重读音节结尾的动词, 要双写末尾一个辅音字母, 再加ing
    # 注意, 如词尾的辅音字母是'w','x'和'y', 就不需要双写结尾的字母
    # 英国英语中, 双音节动词以一个元音字母加一个'l'字母结尾时, 要双写末尾一个辅音字母. 而美国英语中, 可不双写.
    if re.search("[aeiou][^aeiouwxy]$", word):
        ww = re.sub("$", word[-1]+"ing", word)
        if ww == pp:
            return pp
    # 以'c'结尾的动词, 通常加'king'构成现在分词
    ww = re.sub("c$", "king", word)
    if ww == pp:
        return pp

    return None


# 某些动词的过去式或过去分词不止一个
def verb_past_tense(row):
    if len(row) < 12: return

    word = row[0]
    pp   = row[10]

    # 一般情况下在动词后加ed
    if (word+"ed") == pp:
        return pp #print(word+":"+pp)

    # 以不发音的字母e结尾的动词, 先去掉e再加ed
    if re.search("e$", word):
        if re.sub("e$", "ed", word) == pp:
            return pp#print(word+":"+pp)
        else:
            return None#print(word+":"+pp)

    # 以辅音字母加'y '结尾的动词构成过去式时用'ied '代替'y
    if re.search("[^aeiou]y$", word):
        if re.sub("y$", "ied", word) == pp:
            return pp#print(word+":"+pp)
        else:
            return None# print(word+":"+pp)

    # 动词原形是单音节词, 词尾是一个元音字母加一个辅音字母, 在加'ing '或'ed前先双写该辅音字母。
    # 有些双音节动词的第二个音节以一个元音字母加一个辅音字母结尾, 同时又要重读, 在加'ing '或'ed前, 这类双音节动词的最后一个辅音字母也要双写。
    # 英国英语中, 双音节动词以一个元音字母加一个'l'字母结尾时, 要双写末尾一个辅音字母. 而美国英语中, 可不双写.
    if re.search("[aeiou][^aeiouwxy]$", word):
        ww = re.sub("$", word[-1]+"ed", word)
        if ww == pp:
            return pp

    # c结尾的动词, 通常加'ked '构成过去式
    ww = re.sub("c$", "ked", word)
    if ww == pp:
        return pp

    return None

def verb_past_participle(row):
    if len(row) < 12: return

    word = row[0]
    pp   = row[11]

    # 一般情况下在动词后加ed
    if (word+"ed") == pp:
        return pp

    # 以不发音的字母e结尾的动词, 先去掉e再加ed
    if re.search("e$", word):
        if re.sub("e$", "ed", word) == pp:
            return pp
        else:
            return None#print(word+":"+pp)

    # 以辅音字母加'y '结尾的动词构成过去式时用'ied '代替'y
    if re.search("[^aeiou]y$", word):
        if re.sub("y$", "ied", word) == pp:
            return pp
        else:
            return None# print(word+":"+pp)

    # 动词原形是单音节词, 词尾是一个元音字母加一个辅音字母, 在加'ing '或'ed前先双写该辅音字母。
    # 有些双音节动词的第二个音节以一个元音字母加一个辅音字母结尾, 同时又要重读, 在加'ing '或'ed前, 这类双音节动词的最后一个辅音字母也要双写。
    # 英国英语中, 双音节动词以一个元音字母加一个'l'字母结尾时, 要双写末尾一个辅音字母. 而美国英语中, 可不双写.
    if re.search("[aeiou][^aeiouwxy]$", word):
        ww = re.sub("$", word[-1]+"ed", word)
        if ww == pp:
            return pp

    # c结尾的动词, 通常加'ked '构成过去式

    # c结尾的动词, 通常加'king '与'ked '构成现在分词和过去式
    ww = re.sub("c$", "ked", word)
    if ww == pp:
        return pp

    return None
#=====================================

f = open('E:\\en-verbs.txt', 'r')

with f:

    reader = csv.reader(f)

    for row in reader:
        if len(row) < 4: continue

        word = row[0]

        s  = verb_Singular_From_in_Third_Personal(row)
        ing= verb_present_participle(row)
        pt = verb_past_tense(row)
        pp = verb_past_participle(row)

        if s and ing and pt and pp:
           print("{},{},{},{},{}".format(word,s,ing,pt,pp))

